<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>(Tutorial) Download Pornhub Videos with Violentmonkey 😏 | 俊樹&#39;s Miscellaneous</title>

    
<link href="/favicon/favicon.ico" rel="shortcut icon" type="image/x-icon" />




<meta name="author" content="安田俊樹" />
<meta name="description" content="You must had the experience of watching Pornhub without logging in, and you SUDDENLY see a good video that fits you, but just next time you can&amp;rsquo;t find it, the fast yet useful solution to this is to download the video at once. No more to say, you use Pornhub, we buddies 😏.
" />



<meta name="generator" content="Hugo 0.81.0" />

<link rel="canonical" href="https://AShao0425.github.io/posts/pornhub-download/" />


<meta property="og:title" content="(Tutorial) Download Pornhub Videos with Violentmonkey 😏" />
<meta property="og:description" content="You must had the experience of watching Pornhub without logging in, and you SUDDENLY see a good video that fits you, but just next time you can&rsquo;t find it, the fast yet useful solution to this is to download the video at once. No more to say, you use Pornhub, we buddies 😏." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://AShao0425.github.io/posts/pornhub-download/" /><meta property="og:image" content="https://AShao0425.github.io/post5/Pornhub-logo.svg" /><meta property="article:section" content="posts" />
<meta property="article:published_time" content="2021-09-26T03:36:36&#43;08:00" />
<meta property="article:modified_time" content="2021-09-26T03:36:36&#43;08:00" />




<meta name="twitter:card" content="summary_large_image"/>
<meta name="twitter:image" content="https://AShao0425.github.io/post5/Pornhub-logo.svg"/>

<meta name="twitter:title" content="(Tutorial) Download Pornhub Videos with Violentmonkey 😏"/>
<meta name="twitter:description" content="You must had the experience of watching Pornhub without logging in, and you SUDDENLY see a good video that fits you, but just next time you can&rsquo;t find it, the fast yet useful solution to this is to download the video at once. No more to say, you use Pornhub, we buddies 😏."/>


<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">
<link rel="stylesheet" href="/css/icomoon.css" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/overlayscrollbars@1.13.1/css/OverlayScrollbars.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css@4.0.0/github-markdown.min.css">
<link rel="stylesheet" href="/css/site.css" />

<style>
  .ui.header a:not(.item, .ui.button):hover {
    text-decoration: underline;
  }

  
  a:not(.item, .ui.button) {
    color: seagreen !important;
  }
  

  
  .inverted a:not(.item, .ui.button) {
     color: darkseagreen !important;
  }
  

  
  body.default {
    
    background-color: ZgotmplZ;
    

    
    background-image: url(/background/back1.png);
    
  }
  

  
  body.dark {
    
    background-color: ZgotmplZ;
    

    
    background-image: url(/background/BackgroundBlack.jpg);
    
  }
  
</style>


<script>
  document.addEventListener('visibilitychange',function(){
      if( document.visibilityState == 'hidden' ){
      normal_title = document.title;
      document.title = 'w(ﾟДﾟ)w Ugh, site crashed！';
      }else{
      document.title = '(/▽＼) Yay, Site got fixed！';
      setTimeout(function(){
          document.title = normal_title;
      }, 1200)
      }
  });
</script>


<script src="/js/pace.min.js"></script>
<link href="/css/pace-theme-flash.css" rel="stylesheet">

    



<link rel="stylesheet" data-highlight href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/styles/tomorrow.min.css" />




<script src='//unpkg.com/valine/dist/Valine.min.js'></script>




    
    <link rel="stylesheet" href="/css/custom.css" />
    
	
	
    <link rel="stylesheet" href="/live2d/css/live2d.css" />

  
    <link rel="stylesheet" href="/css/APlayer.min.css">
    <script src="/js/APlayer.min.js"></script>
  
    <script src="/js/Meting.min.js"></script>

  </head>

  <body class="default">
    
<nav class="ui secondary menu dream-menu dream-nav">

  <a class="item dream-flip-toggle" title="Flip it!">
    <i class="large link bullseye icon"></i>
  </a>
  <a class="item" href="https://AShao0425.github.io/" title="Home">
    <i class="large link home icon"></i>
  </a>
  
  <a class="item" onclick="themeSwitch(event)">
    <i class="large link icon theme-switch"></i>
  </a>
  
  
  <a class="item" title="Search" onclick="toggleSearch(event)">
    <i class="large link search icon"></i>
  </a>
  
</nav>

    <div class="flip-container">
      <div class="flipper">
        <section class="front">
          <div class="dream-max-width">
            
<div class="ui relaxed centered grid dream-grid dream-grid-single">
  
  
  
  

  
  <aside class="sixteen wide mobile sixteen wide tablet three wide computer column dream-single-aside">
    
    <div class="ui segment toc">
      <nav id="TableOfContents">
  <ul>
    <li><a href="#introduction">Introduction</a></li>
    <li><a href="#procedures">Procedures</a></li>
    <li><a href="#afterwords">Afterwords</a></li>
    <li><a href="#reference">Reference</a></li>
  </ul>
</nav>
    </div>
    

    
  </aside>
  
  <div class="sixteen wide mobile sixteen wide tablet ten wide computer column markdown-body dream-single" id="dream-save-post-as-img">
    <section class="ui top attached segment">
      <header>
        <h1 class="ui large header">(Tutorial) Download Pornhub Videos with Violentmonkey 😏<span class="sub header">
            <span class="left">
              @
              
                
                  安田俊樹
                
              

              | 
                  <span data-format="luxon">2021-09-26T03:36:36&#43;08:00</span>
                

              | 8 minutes read

              
              | Update at
                
                  <span data-format="luxon">2021-09-26T03:36:36&#43;08:00</span>
                
              
            </span>

            
            <span class="dream-share">
  <a href="#" class="save-as-image" title="Save as image" onclick="savePostAsImg()">
    <i class="save icon"></i>
  </a>
  <a href="https://twitter.com/intent/tweet?text=%28Tutorial%29%20Download%20Pornhub%20Videos%20with%20Violentmonkey%20%f0%9f%98%8f&url=https%3a%2f%2fAShao0425.github.io%2fposts%2fpornhub-download%2f" title="Twitter">
    <i class="twitter icon"></i>
  </a>
  <a href="https://facebook.com/sharer/sharer.php?u=https%3a%2f%2fAShao0425.github.io%2fposts%2fpornhub-download%2f" title="Facebook">
    <i class="facebook icon"></i>
  </a>
</span>

            
          </span>
        </h1>
      </header>

      <article class="main">
        
        <img class="cover" src="/post5/pornhub2.gif" />
        

        <p><em>You must had the experience of watching Pornhub without logging in, and you SUDDENLY see a good video that fits you, but just next time you can&rsquo;t find it, the fast yet useful solution to this is to download the video at once. No more to say, you use Pornhub, we buddies 😏.</em></p>
<p><meting-js
name="Worth It (Reunify vs. Kris Maydak vs. Danyka Nadeau) [feat. Danyka Nadeau] [Radio Mix]"
artist="Danyka Nadeau / Kris Maydak / Reunify"
url="/music/Worth It (Reunify vs. Kris Maydak vs. Danyka Nadeau) [feat. Danyka Nadeau] [Radio Mix].m4a"
cover="/music/cover/3.jpg"
lrc="/music/lyrics/Worth It (Reunify vs. Kris Maydak vs. Danyka Nadeau) [feat. Danyka Nadeau] [Radio Mix].lrc">
</meting-js></p>
<blockquote>
<p>I wrote the same blog just 2 weeks ago, but when I run <code>hugo server</code>, every other blog pages shows but only this one about Pornhub, I initially thought Hugo has automatic pornography content detect feature but I was wrong, it works, well, I must met some format error before that did not make the blog page render.</p>
</blockquote>
<h2 id="introduction">Introduction</h2>
<p>First of all, <a href="https://www.pornhub.com/">Pornhub</a> you <strong>son of a bitch</strong>, but you also an <strong>saviour</strong> for those people who do not have a partner yet in this current days while <strong>Google LLC</strong> starts to block inappropriate content again, which we cannot find any more pornographic content from web anymore.</p>
<p>Why Pornhub son of bitch? I don&rsquo;t want to explain more, you have to login for commenting or premium content, I don&rsquo;t know what you guys feel about this, in my sort of perspective Pornhub will sell their user information to Google to ban the users that has ever registered to their site, this is more about personal privacy concern. The other reason is common users are unable to download premium video contents,</p>
<img align="right" width="60%" src="/post5/pricing.png">
<p>Alright and look what the fuck is this, $9.99 per month, $7.99 per year with only $2 off, really? Really Pornhub? Why the fuck don&rsquo;t you go rob? I know most of the videos are free there, but imagine, when you browsed for a long time on Pornhub and suddenly you see a video you like, then you click to enter the link with a dick in flagpole, then you watched the video for around 2 minutes then a premium payment window pops out and ask you to pay to unlock the entire video, you got ruined, imagine how shit that is. So here&rsquo;s a way to download Pornhub Videos, both normal or premium ones by using an extension called <strong><a href="https://violentmonkey.github.io/">🐵Violentmonkey</a></strong> to load JavaScript programs that can be used to modify web pages.</p>
<h2 id="procedures">Procedures</h2>
<ul>
<li>To start with, go to <a href="https://chrome.google.com/webstore/category/extensions?hl=en">chrome web store</a> to download an <strong><a href="https://developer.chrome.com/docs/extensions/">extension</a></strong> (check on the link in case you don&rsquo;t know what an extension is), search <strong>Violentmonkey in the side bar</strong>. (For China users, you might need to have your VPN on since all Google products and its accessories are blocked.)</li>
</ul>
<p align="center" width="100%">
    <img width="70%" src="/post5/img.png"> 
</p>
<blockquote>
<p><strong>⚠ For Firefox Users</strong>: Download addon from <a href="https://addons.mozilla.org/en-US/firefox/addon/violentmonkey/?utm_source=addons.mozilla.org&amp;utm_medium=referral&amp;utm_content=search">Here</a></p>
</blockquote>
<p align="center" width="100%">
  <img width="70%" src="/post5/img14.png"> 
</p>
<blockquote>
<p><strong>⚠ For Microsoft Edge Users</strong>: Download extension from <a href="https://microsoftedge.microsoft.com/addons/detail/violentmonkey/eeagobfjdenkkddmbclomhiblgggliao">Here</a>, <strong>Chinese users can use Microsoft Edge as an alternative to Chrome, Microsoft&rsquo;s addon store is not blocked in China</strong></p>
</blockquote>
<p align="center" width="100%">
  <img width="70%" src="/post5/img15.png"> 
  <img width="70%" src="/post5/img16.png">
</p>
<ul>
<li>Hit <kbd>enter</kbd> there should be two results pops up, select the first result as shown in the image below</li>
</ul>
<p align="center" width="100%">
    <img width="70%" src="/post5/img2.png"> 
</p>
<ul>
<li>Click on <kbd>Add to Chrome</kbd> button, then a notification window should pop out asking you to confirm installation, click on <code>Add extemson</code>, the extension will be installed shortly.</li>
</ul>
<p align="center" width="100%">
    <img width="70%" src="/post5/img3.png"> 
    <img width="70%" src="/post5/img4.png"> 
</p>
<ul>
<li><strong>Here&rsquo;s the important thing, you will see an extra &ldquo;🐵 monkey&rdquo; icon in your navigation bar at the top of your browser, click on the icon, a drop down menu should pop out, click on <code>+</code> on the top left corner of the dropdown menu.</strong></li>
</ul>
<p align="center" width="100%">
    <img width="70%" src="/post5/img5.png"> 
    <img width="70%" src="/post5/img6.png"> 
</p>
<ul>
<li>It should direct you to a code editor page, copy and paste the code <strong><a href="#jump">HERE</a></strong> to the editor, then click on <code>Save &amp; Close</code>, it&rsquo;ll direct you to the main page of Violentmonkey, which you can check whether the script is installed or not.</li>
</ul>
<p align="center" width="100%">
    <img width="70%" src="/post5/img7.png"> 
    <img width="70%" src="/post5/img8.png"> 
</p>
<ul>
<li>Now navigate to <a href="https://pornhub.com/">Pornhub</a>, <strong>you&rsquo;ll notice a small number on the icon of Violentmonkey at the navigation bar, it indicates the number of Javascript you are currently loading on that specific webpage.</strong> Let&rsquo;s select a random video for a test round to test the script, as shown in the image, after you open a video, a link list will appear below the video description, you can choose the video resolution to your desire to download, click on <code>Click to copy address</code>.</li>
</ul>
<p align="center" width="100%">
    <img width="70%" src="/post5/img9.png"> 
    <img width="70%" src="/post5/img10.png"> 
</p>
<ul>
<li>Now paste the link you copied to your browser&rsquo;s address bar, press <kbd>Enter</kbd> to download, if it works properly and you are currently using an external downloader, it should work like this, <em>(I&rsquo;ll write a separate blog page about downloader later)</em></li>
</ul>
<p align="center" width="100%">
    <img width="70%" src="/post5/img11.png"> 
    <img width="70%" src="/post5/img12.png"> 
</p>
<ul>
<li>Or if you do not use a downloader, it should direct you to a separate video player like this, click on the <code>...</code> at the bottom right corner, click on <code>download</code> to download with your browser&rsquo;s default downloader.</li>
</ul>
<p align="center" width="100%">
    <img width="70%" src="/post5/img13.png">  
</p>
<ul>
<li>**Now wait until download finishes! Then enjoy!!! **</li>
</ul>
<h2 id="jump">Javascript</h2>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-javascript" data-lang="javascript"><span style="color:#75715e">// ==UserScript==
</span><span style="color:#75715e">// @icon         https://ci.phncdn.com/www-static/favicon.ico
</span><span style="color:#75715e">// @name         Download Pornhub Videos with One Click | pornhub.com
</span><span style="color:#75715e">// @version      0.1.3
</span><span style="color:#75715e">// @description  Download Pornhub Videos with One Click | pornhub.com | Download Pornhub Videos with no Login Requirements | Direct Pornhub Premium Video Download | Download restricted videos | Download videos with all available resolutions
</span><span style="color:#75715e">// @author       安田俊樹 | Translated by 安田俊樹
</span><span style="color:#75715e">// @match        *://*.pornhub.com/view_video.php?viewkey=*
</span><span style="color:#75715e">// @match        *://*.pornhubpremium.com/view_video.php?viewkey=*
</span><span style="color:#75715e">// @grant        unsafeWindow
</span><span style="color:#75715e">// @grant        GM_setClipboard
</span><span style="color:#75715e">// @grant        GM_download
</span><span style="color:#75715e">// @grant        GM_addStyle
</span><span style="color:#75715e">// @grant        GM_notification
</span><span style="color:#75715e">// @require      https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js
</span><span style="color:#75715e">// ==/UserScript==
</span><span style="color:#75715e"></span>
<span style="color:#a6e22e">GM_addStyle</span>(<span style="color:#e6db74">`
</span><span style="color:#e6db74">.download-urls ul {
</span><span style="color:#e6db74">  padding: 10px;
</span><span style="color:#e6db74">  font-weight: bold;
</span><span style="color:#e6db74">  line-height: 1.5;
</span><span style="color:#e6db74">}
</span><span style="color:#e6db74">.download-urls ul li {
</span><span style="color:#e6db74">  display: flex;
</span><span style="color:#e6db74">  align-items: center;
</span><span style="color:#e6db74">  height: 20px;
</span><span style="color:#e6db74">}
</span><span style="color:#e6db74">.download-url-label {
</span><span style="color:#e6db74">  //width: 100px;
</span><span style="color:#e6db74">  text-align: right;
</span><span style="color:#e6db74">}
</span><span style="color:#e6db74">.download-url-copy {
</span><span style="color:#e6db74">  flex: 1;
</span><span style="color:#e6db74">}
</span><span style="color:#e6db74">.download-url-input {
</span><span style="color:#e6db74">  flex: 3;
</span><span style="color:#e6db74">  font-size: 12px;
</span><span style="color:#e6db74">  padding: 0 5px;
</span><span style="color:#e6db74">  border: 1px solid #ffff;
</span><span style="color:#e6db74">  margin: 0 5px;
</span><span style="color:#e6db74">}
</span><span style="color:#e6db74">`</span>);

(<span style="color:#66d9ef">function</span>() {
  <span style="color:#e6db74">&#39;use strict&#39;</span>;

  <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">MutationObserver</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">unsafeWindow</span>.<span style="color:#a6e22e">MutationObserver</span> <span style="color:#f92672">||</span> <span style="color:#a6e22e">unsafeWindow</span>.<span style="color:#a6e22e">WebKitMutationObserver</span> <span style="color:#f92672">||</span> <span style="color:#a6e22e">unsafeWindow</span>.<span style="color:#a6e22e">MozMutationObserver</span>;
  <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">mutationObserver</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">MutationObserver</span>(<span style="color:#a6e22e">mutations</span> =&gt; {
    <span style="color:#a6e22e">mutationObserver</span>.<span style="color:#a6e22e">disconnect</span>();
    <span style="color:#a6e22e">setTimeout</span>(() =&gt; {
      <span style="color:#a6e22e">unsafeWindow</span>.<span style="color:#a6e22e">VideoParsing</span>.<span style="color:#a6e22e">init</span>();
    }, <span style="color:#ae81ff">200</span>);
  });
  <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">playerDom</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#39;#player&#39;</span>);

  <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">playerDom</span>) {
    <span style="color:#a6e22e">mutationObserver</span>.<span style="color:#a6e22e">observe</span>(<span style="color:#a6e22e">playerDom</span>, {
      <span style="color:#a6e22e">childList</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">true</span>,
      <span style="color:#a6e22e">subtree</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">true</span>,
    });
  }<span style="color:#66d9ef">else</span> {
    <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">warn</span>(<span style="color:#e6db74">&#39;One click to download did not work！&#39;</span>);
  }
})();

(<span style="color:#66d9ef">function</span>() {
  <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">VideoParsing</span> {
    <span style="color:#75715e">// Retrieves the value of the object based on the key prefix, and returns an array
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">static</span> <span style="color:#a6e22e">getObjectValueByStartsWithChar</span>(<span style="color:#a6e22e">obj</span>, <span style="color:#66d9ef">char</span>) {
      <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">vars</span> <span style="color:#f92672">=</span> [];
      Object.<span style="color:#a6e22e">keys</span>(<span style="color:#a6e22e">obj</span>).<span style="color:#a6e22e">forEach</span>(<span style="color:#a6e22e">key</span> =&gt; {
        <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">key</span>.<span style="color:#a6e22e">startsWith</span>(<span style="color:#66d9ef">char</span>)) {
          <span style="color:#a6e22e">vars</span>.<span style="color:#a6e22e">push</span>({
            <span style="color:#a6e22e">key</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">key</span>,
            <span style="color:#a6e22e">value</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">obj</span>[<span style="color:#a6e22e">key</span>],
          });
        }
      });
      <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">vars</span>;
    }

    <span style="color:#75715e">// Fetch the download address information and returns an array
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">static</span> <span style="color:#a6e22e">getUrlInfo</span>() {
      <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">flashvars</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">getObjectValueByStartsWithChar</span>(<span style="color:#a6e22e">unsafeWindow</span>, <span style="color:#e6db74">&#39;flashvars_&#39;</span>);
      <span style="color:#66d9ef">if</span>(<span style="color:#f92672">!</span><span style="color:#a6e22e">flashvars</span>.<span style="color:#a6e22e">length</span>) {
        <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">error</span>(<span style="color:#e6db74">&#39;Error！Cannot fetch video address！&#39;</span>, <span style="color:#a6e22e">flashvars</span>);
        <span style="color:#66d9ef">return</span>;
      }

      <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">videosInfo</span> <span style="color:#f92672">=</span> [];

      <span style="color:#66d9ef">try</span> {
        <span style="color:#a6e22e">videosInfo</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">flashvars</span>[<span style="color:#ae81ff">0</span>][<span style="color:#e6db74">&#39;value&#39;</span>][<span style="color:#e6db74">&#39;mediaDefinitions&#39;</span>];
      }<span style="color:#66d9ef">catch</span>(<span style="color:#a6e22e">e</span>) {
        <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">error</span>(<span style="color:#e6db74">&#39;Error! Failed to fetch video information！&#39;</span>, <span style="color:#a6e22e">e</span>, <span style="color:#a6e22e">flashvars</span>);
        <span style="color:#66d9ef">return</span>;
      }

      <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">remoteAddress</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">undefined</span>;
      <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">urlInfo</span> <span style="color:#f92672">=</span> [];

      <span style="color:#66d9ef">for</span>(<span style="color:#66d9ef">let</span> <span style="color:#a6e22e">i</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">i</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">videosInfo</span>.<span style="color:#a6e22e">length</span>; <span style="color:#a6e22e">i</span><span style="color:#f92672">++</span>) {
        <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">videosInfo</span>[<span style="color:#a6e22e">i</span>][<span style="color:#e6db74">&#39;remote&#39;</span>]) {
          <span style="color:#a6e22e">remoteAddress</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">videosInfo</span>[<span style="color:#a6e22e">i</span>][<span style="color:#e6db74">&#39;videoUrl&#39;</span>];
          <span style="color:#66d9ef">break</span>;
        }
      }

      <span style="color:#75715e">// MP4 Information
</span><span style="color:#75715e"></span>      <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">remoteAddress</span>) {
        <span style="color:#a6e22e">$</span>.<span style="color:#a6e22e">ajax</span>({
          <span style="color:#a6e22e">url</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">remoteAddress</span>,
          <span style="color:#66d9ef">async</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span>,
          <span style="color:#a6e22e">success</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">data</span>) =&gt; {
            <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">data</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">length</span>) {
              <span style="color:#a6e22e">urlInfo</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">urlInfo</span>.<span style="color:#a6e22e">concat</span>(<span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">map</span>(<span style="color:#a6e22e">item</span> =&gt; ({
                <span style="color:#a6e22e">quality</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">quality</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;.&#39;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">format</span>,
                <span style="color:#a6e22e">url</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">videoUrl</span>
              })));
            }
          }
        });
      }

      <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">videosInfo</span>);

      <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">urlInfo</span>;
    }

    <span style="color:#75715e">// Inject into the download panel
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">static</span> <span style="color:#a6e22e">injectUrls2Dom</span>(<span style="color:#a6e22e">urlInfo</span>) {
      <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">li</span> <span style="color:#f92672">=</span> [];

      <span style="color:#a6e22e">urlInfo</span>.<span style="color:#a6e22e">forEach</span>(<span style="color:#a6e22e">item</span> =&gt; {
        <span style="color:#a6e22e">li</span>.<span style="color:#a6e22e">push</span>(<span style="color:#e6db74">`
</span><span style="color:#e6db74">          &lt;li&gt;
</span><span style="color:#e6db74">            &lt;span class=&#34;download-url-label&#34;&gt;[ </span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">quality</span> <span style="color:#e6db74">}</span><span style="color:#e6db74"> ]&lt;/span&gt;
</span><span style="color:#e6db74">            &lt;input class=&#34;download-url-input&#34; value=&#34;</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">url</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; /&gt;
</span><span style="color:#e6db74">            &lt;a target=&#34;_blank&#34; class=&#34;download-url-copy&#34; data-href=&#34;</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">url</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; href=&#34;javascript: void(0);&#34;&gt;Click to copy address&lt;/a&gt;
</span><span style="color:#e6db74">          &lt;/li&gt;
</span><span style="color:#e6db74">        `</span>);
      });

      <span style="color:#a6e22e">$</span>(<span style="color:#e6db74">&#39;.title-container&#39;</span>).<span style="color:#a6e22e">before</span>(<span style="color:#e6db74">`&lt;div class=&#34;download-urls&#34;&gt;&lt;h3&gt;Download address of different video resolution：&lt;/h3&gt;&lt;ul&gt;</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">li</span>.<span style="color:#a6e22e">join</span>(<span style="color:#e6db74">&#39;&#39;</span>) <span style="color:#e6db74">}</span><span style="color:#e6db74">&lt;/ul&gt;&lt;/div&gt;`</span>);
    }

    <span style="color:#75715e">// Initialize events
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">static</span> <span style="color:#a6e22e">initEvens</span>() {
      <span style="color:#75715e">// Click to copy download address to clipboard
</span><span style="color:#75715e"></span>      <span style="color:#a6e22e">$</span>(document).<span style="color:#a6e22e">on</span>(<span style="color:#e6db74">&#39;click&#39;</span>, <span style="color:#e6db74">&#39;.download-url-copy&#39;</span>, <span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">e</span>) {
        <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">preventDefault</span>();
        <span style="color:#a6e22e">GM_setClipboard</span>(<span style="color:#a6e22e">$</span>(<span style="color:#66d9ef">this</span>).<span style="color:#a6e22e">data</span>(<span style="color:#e6db74">&#39;href&#39;</span>));
        <span style="color:#a6e22e">GM_notification</span>(<span style="color:#e6db74">&#39;Successfully copied the download address!&#39;</span>, <span style="color:#e6db74">&#39;Notification&#39;</span>);
      });
    }

    <span style="color:#66d9ef">static</span> <span style="color:#a6e22e">init</span>() {
      <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">injectUrls2Dom</span>(<span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">getUrlInfo</span>());
      <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">initEvens</span>();
    }
  }

  <span style="color:#a6e22e">unsafeWindow</span>.<span style="color:#a6e22e">VideoParsing</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">VideoParsing</span>;
})();
</code></pre></div><h2 id="afterwords">Afterwords</h2>
<p>Violentmonkey was originally a addon for Firefox, but the author migrated and rewrote the extension for Chrome users and I was a heavy Firefox user not too long ago, but unexpected crashes in webkit happens from time to time, at meanwhile, Violentmonkey became available in Chrome Web Store, this made me left Firefox to chromium-based browsers.</p>
<p>For script-loading plugins, some people might prefers to use <a href="https://www.tampermonkey.net">Tampermonkey</a> or <a href="https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/">Greasemonkey</a> for alternatives, features of both extensions are basically the same as Violentmonkey, import scripts, export to zips, etc, but neither UI design of Tampermonkey nor Greasemonkey fits my demand, and Tampermonkey crashes really often, this drives me crazy. Under a long-term comparison, I still selected Violentmonkey as my first-hand userscript manager, yet Violentmonkey supports a wide range of browsers comparing to the other two, here&rsquo;s a table of the three extensions and its corresponding supported browsers to show a more explicit explanation.</p>
<table>
<thead>
<tr>
<th>Browsers</th>
<th>Greasymonkey</th>
<th>Tampermonkey</th>
<th>Violentmonkey</th>
</tr>
</thead>
<tbody>
<tr>
<td>Chrome</td>
<td>❌</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Edge</td>
<td>❌</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Safari</td>
<td>❌</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Firefox</td>
<td>✔</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Opera</td>
<td>❌</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Vivaldi</td>
<td>❌</td>
<td>❌</td>
<td>✔</td>
</tr>
<tr>
<td>Maxthon</td>
<td>❌</td>
<td>❌</td>
<td>✔</td>
</tr>
<tr>
<td>Dolphin</td>
<td>❌</td>
<td>✔</td>
<td>❌</td>
</tr>
<tr>
<td>UC</td>
<td>❌</td>
<td>✔</td>
<td>❌</td>
</tr>
</tbody>
</table>
<p><em><strong>If I made anything wrong, please correct me at comment!</strong></em></p>
<p>If you decides to write more scripts for your browsing experience in Violentmonkey, that is totally appreciated, but for those people do not know how to write Javascripts, here are several sites that allows people to install scripts from.</p>
<ul>
<li><a href="https://greasyfork.org/">GreasyFork</a> Possibly the largest script source by far, supports various languages.</li>
<li><a href="https://openuserjs.org/">OpenUserJS</a> Another open source script vault, only supports English.</li>
<li><a href="https://www.userscript.zone/">Userscript.Zone</a> A relatively smaller script source, only supports English.</li>
</ul>
<h2 id="reference">Reference</h2>
<hr>
<ol>
<li>Kokdemo. “油猴使用指南 01：传说中的「油猴」与用户脚本 - 少数派.” 少数派 - 高品质数字消费指南, 9 Sept. 2021, <a href="https://sspai.com/post/68574">https://sspai.com/post/68574</a>.</li>
<li>Violent Monkey. Violentmonkey, <a href="https://violentmonkey.github.io/">https://violentmonkey.github.io/</a>.</li>
<li>wanlin, liuwan. “Pornhub 视频一键下载: Pornhub.com.” Translated by 俊樹 安田, Pornhub 视频一键下载 | Pornhub.com, <a href="https://sleazyfork.org/zh-CN/scripts/392449-pornhub-%E8%A7%86%E9%A2%91%E4%B8%80%E9%94%AE%E4%B8%8B%E8%BD%BD-pornhub-com">https://sleazyfork.org/zh-CN/scripts/392449-pornhub-%E8%A7%86%E9%A2%91%E4%B8%80%E9%94%AE%E4%B8%8B%E8%BD%BD-pornhub-com</a>.</li>
</ol>
      </article>
    </section>

    

    

    
    <article class="ui segment" data-html2canvas-ignore>
      <div id="vcomments"></div>
    </article>

    <script>
      new Valine({
        el: '#vcomments',
        appId: "mmsIvsDj8zvjpXmWqjS1DE0a-MdYXbMMI",
        appKey: "SM2s2HytuJJzA4lKWcAVKGMG",
        lang:  null 
      })
    </script>
    
  </div>
</div>

            <footer class="ui basic center aligned segment" style="background-color: transparent;">
              
              <p>© 2020 - 2021 俊樹&#39;s Miscellaneous</p>
              
            
            
            <script type="text/javascript"> 
              if(window.console) {
	              var cons = console; 
	              if(cons) { 
		              cons.group("Hey hey hey👀！");
		              cons.info("👋🏻Hi there, YES IT'S YOU, watching my source code yea?！I'm watching you🖕🏻 https://ashao0425.github.io/"); 
		              cons.log("%c俊樹's Miscellaneous", "background-image: linear-gradient(#063053, #395873, #5c7c99);font-size: 2rem;");
		              cons.info("==============================Splitting Line==============================");
		              cons.log("  █████▒█    ██  ▄████▄   ██ ▄█▀       ██████╗ ██╗   ██╗ ██████╗\n▓██   ▒ ██  ▓██▒▒██▀ ▀█   ██▄█▒        ██╔══██╗██║   ██║██╔════╝\n▒████ ░▓██  ▒██░▒▓█    ▄ ▓███▄░        ██████╔╝██║   ██║██║  ███╗\n░▓█▒  ░▓▓█  ░██░▒▓▓▄ ▄██▒▓██ █▄        ██╔══██╗██║   ██║██║   ██║\n░▒█░   ▒▒█████▓ ▒ ▓███▀ ░▒██▒ █▄       ██████╔╝╚██████╔╝╚██████╔╝\n ▒ ░   ░▒▓▒ ▒ ▒ ░ ░▒ ▒  ░▒ ▒▒ ▓▒       ╚═════╝  ╚═════╝  ╚═════╝\n ░     ░░▒░ ░ ░   ░  ▒   ░ ░▒ ▒░\n ░ ░    ░░░ ░ ░ ░        ░ ░░ ░\n          ░     ░ ░      ░  ░\n")
		              cons.groupEnd();
	              } 
              }
              </script>
              
			        
              <center>
                <script async src="/js/busuanzi.pure.mini.js"></script>
				        👀Site views: <span style="color:seagreen"><span id="busuanzi_value_site_pv"></span></span> times
              </center>
              
			        
              <center>
                👶Site age: <SPAN id=span_dt_dt style="color: #2E8B57;"></SPAN>
                <SCRIPT language=javascript>
                function show_date_time(){
                window.setTimeout("show_date_time()", 1000);
                BirthDay=new Date("9/5/2021 02:14:49");
                today=new Date();
                timeold=(today.getTime()-BirthDay.getTime());
                sectimeold=timeold/1000
                secondsold=Math.floor(sectimeold);
                msPerDay=24*60*60*1000
                e_daysold=timeold/msPerDay
                daysold=Math.floor(e_daysold);
                e_hrsold=(e_daysold-daysold)*24;
                hrsold=Math.floor(e_hrsold);
                e_minsold=(e_hrsold-hrsold)*60;
                minsold=Math.floor((e_hrsold-hrsold)*60);
                seconds=Math.floor((e_minsold-minsold)*60);
                span_dt_dt.innerHTML=""+daysold+" "+"days"+" "+hrsold+" "+"hours"+" "+minsold+" "+"minutes"+" "+seconds+" "+"seconds";
                }
                show_date_time();
                </SCRIPT>
              </center>
              
              
              
              
            </footer>
          </div>
        </section>
        <section class="back">
          <div class="dream-max-width">
            <header class="ui basic very padded segment dream-header">
  
  <div class="ui small circular image">
    <img src="/avatar/Avatar3.jpg" alt="avatar" />
  </div>
  

  

  <div class="content">
    <h1 class="ui medium header">俊樹&#39;s Miscellaneous<span class="sub header"><div id="binft"></div><script>var binft=function(t){function r(){return f[Math.floor(Math.random()*f.length)]}function e(){return String.fromCharCode(94*Math.random()+33)}function n(t){for(var n=document.createDocumentFragment(),i=0;t>i;i++){var l=document.createElement("span");l.textContent=e(),l.style.color=r(),n.appendChild(l)}return n}function i(){var r=a[c.skillI];c.step?c.step--:(c.step=o,c.prefixP<l.length?(c.prefixP>=0&&(c.text+=l[c.prefixP]),c.prefixP++):"forward"===c.direction?c.skillP<r.length?(c.text+=r[c.skillP],c.skillP++):c.delay?c.delay--:(c.direction="backward",c.delay=g):c.skillP>0?(c.text=c.text.slice(0,-1),c.skillP--):(c.skillI=(c.skillI+1)%a.length,c.direction="forward")),t.textContent=c.text,t.appendChild(n(c.prefixP<l.length?Math.min(b,b+c.prefixP):Math.min(b,r.length-c.skillP))),setTimeout(i,d)}var l="",a=["Lover of Mathematics and Science."].map(function(t){return t+""}),g=2,o=1,b=5,d=75,f=["rgb(110,64,170)","rgb(150,61,179)","rgb(191,60,175)","rgb(228,65,157)","rgb(254,75,131)","rgb(255,94,99)","rgb(255,120,71)","rgb(251,150,51)","rgb(226,183,47)","rgb(198,214,60)","rgb(175,240,91)","rgb(127,246,88)","rgb(82,246,103)","rgb(48,239,130)","rgb(29,223,163)","rgb(26,199,194)","rgb(35,171,216)","rgb(54,140,225)","rgb(76,110,219)","rgb(96,84,200)"],c={text:"",prefixP:-b,skillI:0,skillP:0,direction:"forward",delay:g,step:o};i()};binft(document.getElementById("binft"));</script></span>
    </h1>

    <article class="ui horizontal list">
      
      <a class="item" href="/posts">
        <i class="archive icon" title="Archives"></i>
      </a>
      
      <a class="item" href="/categories">
        <i class="th list icon" title="All Categories"></i>
      </a>
      <a class="item" href="/tags">
        <i class="tags icon" title="All Tags"></i>
      </a>
    </article>

    
    
    
    
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
    

    

    
    
    
          <div class="dream-tags">
          
          
          
            <a class="ui label" href="/tags/bash/" title="Bash">
              Bash
            </a>
          
          
          
            <a class="ui label" href="/tags/browsers/" title="Browsers">
              Browsers
            </a>
          
          
          
            <a class="ui label" href="/tags/c/" title="C">
              C
            </a>
          
          
          
            <a class="ui label" href="/tags/chrome/" title="Chrome">
              Chrome
            </a>
          
          
          
            <a class="ui label" href="/tags/code/" title="Code">
              Code
            </a>
          
          
          
            <a class="ui label" href="/tags/css/" title="Css">
              Css
            </a>
          
          
          
            <a class="ui label" href="/tags/design/" title="Design">
              Design
            </a>
          
          
          
            <a class="ui label" href="/tags/download/" title="Download">
              Download
            </a>
          
          
          
            <a class="ui label" href="/tags/extension/" title="Extension">
              Extension
            </a>
          
          
          
            <a class="ui label" href="/tags/game/" title="Game">
              Game
            </a>
          
          
          
            <a class="ui label" href="/tags/git/" title="Git">
              Git
            </a>
          
          
          
            <a class="ui label" href="/tags/github/" title="Github">
              Github
            </a>
          
          
          
            <a class="ui label" href="/tags/gravity/" title="Gravity">
              Gravity
            </a>
          
          
          
            <a class="ui label" href="/tags/html/" title="Html">
              Html
            </a>
          
          
          
            <a class="ui label" href="/tags/hugo/" title="Hugo">
              Hugo
            </a>
          
          
          
            <a class="ui label" href="/tags/js/" title="Js">
              Js
            </a>
          
          
          
            <a class="ui label" href="/tags/latex/" title="LaTeX">
              LaTeX
            </a>
          
          
          
            <a class="ui label" href="/tags/mathematics/" title="Mathematics">
              Mathematics
            </a>
          
          
          
            <a class="ui label" href="/tags/mathjax/" title="MathJax">
              MathJax
            </a>
          
          
          
            <a class="ui label" href="/tags/pornhub/" title="Pornhub">
              Pornhub
            </a>
          
          
          
            <a class="ui label" href="/tags/ssh-key/" title="SSH Key">
              SSH Key
            </a>
          
          
          
            <a class="ui label" href="/tags/tutorial/" title="Tutorial">
              Tutorial
            </a>
          
          
          
            <a class="ui label" href="/tags/violentmonkey/" title="Violentmonkey">
              Violentmonkey
            </a>
          
          
          
            <a class="ui label" href="/tags/website/" title="Website">
              Website
            </a>
          
          </div>
    

    
  </div>

  
  <script src="/js/sweetalert.min.js"></script> 
  <link rel="stylesheet" href="/css/sweetalert.css" type='text/css' media='all' />
</header>

<script>document.body.oncopy = function() {swal("Copied successfully！", "If you would you like to use this site, please attribute or indicate the source if authorized！","success");};</script>

<div class="ui relaxed grid dream-grid dream-back">
  
  
  
  <div class="sixteen wide mobile eight wide tablet four wide computer column dream-column">
    <article class="ui segment markdown-body">
      <div class="ui medium header">Bio 👋</div>
      <ul>
<li><strong>👨Names</strong>:
<ul>
<li>English: Alex Shao</li>
<li>中文: 邵宪辉</li>
<li>日本語：安田俊樹</li>
</ul>
</li>
<li><strong>👀Age</strong>: 16, 2005/4/25</li>
<li><strong>🏫School</strong>: SLAS (shittiest school ever)</li>
<li><strong>❤️Interests</strong>: Python, Html, Java, Js, Anime(especially &ldquo;ダンジョンに出会いを求めるのは間違っているだろうか&rdquo;), Math, Science, Sleep, Diarreah &amp; Constipation (Well, I had stomache issue since I was born, innate), bikes</li>
<li><strong>🚩Nationality</strong>: Chinese &amp; Japanese (Microsoft somehow does not support country flag emojis&hellip;)</li>
<li><strong>💼Occupation</strong>: Student</li>
<li><strong>📺Movies</strong>: No movies, animes only, &ldquo;ダンジョンに出会いを求めるのは間違っているだろうか&rdquo;</li>
<li><strong>📫Email</strong>: <a href="mailto:alex2005@gmail.com">alex2005@gmail.com</a></li>
<li><strong>👨‍🏫Values</strong>: Constrain impetuosity</li>
<li><strong>🐧QQ</strong>: 1959796501 (Also contact my QQ besides mail)</li>
<li><strong>💻Device</strong>: Huawei Matebook 14, 2019</li>
<li><strong>🖱️IDE</strong>: VsCode</li>
</ul>

    </article>
  </div>
  
  <div class="sixteen wide mobile eight wide tablet four wide computer column dream-column">
    <article class="ui segment markdown-body">
      <div class="ui medium header">Acknowledgments</div>
      <ul>
<li><strong>Vansh Kamleshbhai Padaliya</strong>: Always helping and assisting with no doubts and hesitations, good buddy, known for 3 years.</li>
<li><strong>吴思萌 Mónica</strong>: An elder sister, always accompanying and encouraging, deskmate in previous school, known for 5 years.</li>
<li><strong>姚轶膑</strong>: Great buddy as well, spent time screwing out often, always encouraging, known for 5 years.</li>
<li><strong>Koki Kin</strong>: Typical Japanese Otaku, still a great buddy, known for 1.5 years, giving help when I need.</li>
<li><strong>Semih Deli</strong>: Known since 2, developed this site together.</li>
<li>All the others people who answered my requests I pulled on Github when I met problems.</li>
</ul>

    </article>
  </div>
  

  <div class="sixteen wide mobile eight wide tablet four wide computer column dream-column">
    <article class="ui segment">
      <div class="ui medium header">Social Links</div>
      <nav class="ui secondary menu dream-menu dream-socials">
  
  <a class="item" href="/index.xml">
    <i class="large rss square icon" title="RSS"></i>
  </a>
  

  
  <a class="item" href="mailto:AlexShao20050425@163.com">
    <i class="large mail icon" title="Email"></i>
  </a>
  

  

  

  

  

  

  

  

  

  
  
  
    <a class="item" href="https://github.com/ashao0425" target="_blank">
      <i class="large github icon" title="GitHub"></i>
    </a>
  
  
</nav>

    </article>
  </div>

  <div class="sixteen wide mobile eight wide tablet four wide computer column dream-column">
    
    <article class="ui segment">
      <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.
    </article>
    
  </div>

  
</div>

          </div>
        </section>
      </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0"></script>
    <script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>

    
    <div class="ui segment" id="dream-search">
  <div class="ui search">
    <div class="ui transparent input">
      <input class="prompt" type="text" placeholder="Search" />
    </div>
    <div class="results"></div>
  </div>
</div>
<script>
  $(document).ready(function () {
    $.getJSON('https:\/\/AShao0425.github.io\//index.json', function (data) {
      $('.ui.search').search({
        source: data,
        searchFields: ['title'],
        showNoResults: false,
      })
    })
  })
</script>
<script src="/js/search.js"></script>

    

    

    <script>
  window.background = "/background/back1.png"
  window.defaultDark =  null 
  window.backgroundDark = "/background/BackgroundBlack.jpg"
  window.backgroundImageDark = "/background/BackgroundBlack.jpg"
  window.darkNav =  true 
  window.maxTags =  null 
  window.hasTwitterEmbed =  null 
  window.fixedNav =  true 

  if (window.hasTwitterEmbed) {
    
    window.twttr = (function (d, s, id) {
      var js,
        fjs = d.getElementsByTagName(s)[0],
        t = window.twttr || {}
      if (d.getElementById(id)) return t
      js = d.createElement(s)
      js.id = id
      js.src = 'https://platform.twitter.com/widgets.js'
      fjs.parentNode.insertBefore(js, fjs)

      t._e = []
      t.ready = function (f) {
        t._e.push(f)
      }

      return t
    })(document, 'script', 'twitter-wjs')
  }
</script>
<script src="https://cdn.jsdelivr.net/npm/overlayscrollbars@1.13.1/js/jquery.overlayScrollbars.min.js"></script>
<script src="/js/header.js"></script>
<script src="/js/main.js"></script>
<script src="/js/theme.js"></script>
    


<script src="https://cdn.jsdelivr.net/npm/luxon@1.26.0"></script>

<script>
  format()

  function format() {
    $('span[data-format="luxon"]').each(function () {
      var date = $(this).text()

      $(this).text(luxon.DateTime.fromISO(date, { locale: "en" }).toFormat("yyyy/MM/dd"))
    })
  }
</script>



<script src="/js/scrollToTop.js"></script>


<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/highlight.min.js"></script>



<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/languages/clojure.min.js"></script>

<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/languages/ocaml.min.js"></script>



<script>
  hljs.highlightAll()
  setHighlightTheme()

  function setHighlightTheme() {
    var isDark = localStore.getItem('hugo-theme-dream-is-dark')
    isDark = isDark ? isDark : window.defaultDark ? 'y' : isDark

    var lightTheme = "tomorrow"
    var darkTheme = "tomorrow-night"
    var theme = isDark === 'y' ? darkTheme : lightTheme

    $('link[data-highlight]').attr('href', 'https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/styles/' + theme + '.min.css')
    $('pre').css('background', isDark === 'y' ? '#333' : '')
  }
</script>



<script src="https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.1"></script>
<script src="/js/post.js" defer></script>


    

    
    
<script type="application/javascript">
var doNotTrack = false;
if (!doNotTrack) {
	window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
	ga('create', 'UA-206749728-1', 'auto');
	
	ga('send', 'pageview');
}
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>

    
	
	
    <div id="landlord">
      <div class="message" style="opacity:0"></div>
      <canvas id="live2d" width="280" height="250" class="live2d"></canvas>
      <div class="hide-button">Hide</div>
    </div>
    
	
    <script type="text/javascript">
      var message_Path = '/live2d/'
      var home_Path = 'https://ashao0425.github.io/'  <!--Edit the domain into yours here-->
    </script>
    <script type="text/javascript" src="/live2d/js/live2d.js"></script>
    <script type="text/javascript" src="/live2d/js/message.js"></script>
    <script type="text/javascript">
      loadlive2d("live2d", "/live2d/model/tia/model.json");
    </script>
  </body>

  
  
  
	
    <canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas> 
    <script type="text/javascript" src="/js/anime.min.js"></script> 
    <script type="text/javascript" src="/js/fireworks.js"></script> 
</html>
